package com.xhj.mybatis.executor.statement;

import com.xhj.mybatis.mapping.BoundSql;
import com.xhj.mybatis.session.ResultHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

/**
 * StatementHandler
 *
 * @author XJks
 * @description SQL语句处理器接口
 */
public interface StatementHandler {
    /**
     * 预编译 SQL 语句，返回一个 Statement 对象
     *
     * @param connection 数据库连接对象
     * @return 预编译后的 Statement 对象
     * @throws SQLException 可能抛出 SQL 异常
     */
    Statement prepare(Connection connection) throws SQLException;

    /**
     * 给 SQL 语句设置参数
     *
     * @param statement 要设置参数的 Statement 对象
     * @throws SQLException 可能抛出 SQL 异常
     */
    void parameterize(Statement statement) throws SQLException;

    /**
     * 执行更新操作（如 INSERT、UPDATE、DELETE）
     *
     * @param statement 要执行的 Statement 对象
     * @return 受影响的行数
     * @throws SQLException 可能抛出 SQL 异常
     */
    int update(Statement statement) throws SQLException;

    /**
     * 执行查询操作，返回结果列表
     *
     * @param statement     要执行的 Statement 对象
     * @param resultHandler 结果处理器
     * @param <E>           结果列表中元素的类型
     * @return 查询结果列表
     * @throws SQLException 可能抛出 SQL 异常
     */
    <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException;

    /**
     * 获取当前要执行的 SQL 及其参数信息
     */
    BoundSql getBoundSql();
}
